package VideoRent;

import java.util.*;

import VideoRent.Cliente.*;
import VideoRent.Alquiler.*;
import VideoRent.Articulo.*;

/**
 * Clase que contiene apuntadores a todos los elementos que se manejan en la
 * videotienda, esta clase es un singleton
 */
public class ElementosTienda{
    private static ElementosTienda singleton = null;
    private ArrayList<ClienteAsociado> clientesAsociados;
    private ArrayList<Articulo> articulos;


    /**
     * Constructor de la clase
     */
    private ElementosTienda(){
        clientesAsociados = new ArrayList<ClienteAsociado>();
        articulos = new ArrayList<Articulo>();
    }


    /**
     * Método para el patrón de diseño Singleton
     * 
     * @return Instancia única de los elementos de la tienda
     */
    public static ElementosTienda getInstance(){
        if(ElementosTienda.singleton == null)
            singleton = new ElementosTienda();
        return singleton;
    }


    /**
     * Metodo para agregar a un cliente asociado a la videotienda
     * 
     * @param cliente El objeto que contiene al cliente que se desea agregar
     */
    public void agregarAsociado(ClienteAsociado cliente){
        clientesAsociados.add(cliente);
    }


    /**
     * Metodo para agregar un artículo nuevo a la videotienda
     * 
     * @param articulo El objeto que contiene el artículo que se desea agregar
     */
    public void agregarArticulo(Articulo articulo){
        this.articulos.add(articulo);
    }

    /**
     * Realiza una búsqueda sobre los clientes asociados en función del código
     * 
     * @param codigo Código del cliente asociado que se desea encontrar
     * 
     * @return Cliente asociado con el código especificado, se devuelve null en
     *         en caso de no conseguirlo
     */
    public ClienteAsociado buscarClienteAsociado(String codigo){
        for(ClienteAsociado c : getClientesAsociados()){
            if (c.getCodigo().equals(codigo)){
                return c;
            }
        }
        return null;
    }


    /**
     * Realiza una búsqueda sobre los clientes asociados en función de la cédula
     * 
     * @param cedula Cédula del cliente asociado que se desea encontrar
     * 
     * @return Cliente asociado con la cédula especificada, se devuelve null en
     *         en caso de no conseguirlo
     */
    public ClienteAsociado buscarClienteAsociado(int cedula){
        for(ClienteAsociado c : getClientesAsociados()){
            if (c.getCedula() == cedula){
                return c;
            }
        }
        return null;
    }


    /**
     * Realiza una búsqueda sobre los artículos en función del código
     * 
     * @param codigo Código del artículo que se desea encontrar
     * 
     * @return Artículo con el código especificado, se devuelve null en
     *         en caso de no conseguirlo
     */
    public Articulo buscarArticulo(String codigo){
        for(Articulo a : getArticulos()){
            if (a.getCodigo().equals(codigo)){
                return a;
            }
        }
        return null;
    }


    /**
     * Este método permite saber todos los clientes registrados hasta este momento
     * en la video tienda
     * 
     * @return Todos los clientes de la video tienda
     */
    public ArrayList<ClienteAsociado> getClientesAsociados(){
        return clientesAsociados;
    }

    public ArrayList<Articulo> getArticulos(){return articulos;}

    //Conjunto de setters de la clase

    public void setClientesAsociados(ArrayList<ClienteAsociado> a){clientesAsociados = a;}
    public void setArticulos(ArrayList<Articulo> a){articulos = a;}
}